#include <stdio.h>
#include <string.h>
#include "algorithm.h"
#include "set.h"

#include "set.c++"
#include "hoistbp.c++"

char* key[10] =
{
  "Zero",
  "One",
  "Two",
  "Three",
  "Four",
  "Five",
  "Six",
  "Seven",
  "Eight",
  "Nine"
};

struct str_less
{
  str_less() {}

  bool operator()(char const* x, char const* y) const
    { return strcmp(x, y) < 0; }
};

void print_elem(char const* elem)
{
  printf("%s\n", elem);
}

int main()
{
  set<char*, str_less> test_set(key, key+10);

  for_each(test_set.begin(), test_set.end(), print_elem);
  printf("\n");

  for_each(test_set.rbegin(), test_set.rend(), print_elem);
  printf("\n");

  set_iterator<char*, str_less> j = test_set.end();

  print_elem(*--j);
  printf("\n");

  print_elem(*--j);
  printf("\n");

  print_elem(*--j);
  printf("\n");

  print_elem(*test_set.find("Three"));
  print_elem(*test_set.lower_bound("Three"));
  print_elem(*test_set.upper_bound("Three"));

  pair<set_iterator<char*, str_less>, set_iterator<char*, str_less> > range = test_set.equal_range("Three");
  for_each(range.first, range.second, print_elem);
  printf("\n");

  set<char*, str_less> s2(test_set);

  for_each(s2.begin(), s2.end(), print_elem);
  printf("\n");

  printf("test_set == s2 %i\n", test_set == s2);
  printf("\n");

  s2.erase("Zero");
  for_each(s2.begin(), s2.end(), print_elem);
  printf("\n");

  printf("test_set == s2 %i\n", test_set == s2);
  printf("\n");
};

